package com.hmdp.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.Follow;
import com.hmdp.entity.User;
import com.hmdp.mapper.FollowMapper;
import com.hmdp.service.IFollowService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.RedisConstants;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private UserServiceImpl userService;

        /**
         * 关注，取关
         * @param followUserId
         * @param isFollow
         * @return
         */
        @Override
        public Result follow(Long followUserId, Boolean isFollow) {
            Long userId = UserHolder.getUser().getId();
            //关注
            if(isFollow) {
                Follow follow=new Follow();
                follow.setFollowUserId(followUserId);
                follow.setUserId(userId);
                follow.setCreateTime(LocalDateTime.now());
                boolean success= save(follow);
                if(success){
                    stringRedisTemplate.opsForSet().add(RedisConstants.FOLLOW_KEY+userId,followUserId.toString());
                }
            } else {
                //取关
                boolean isSuccess = remove(new QueryWrapper<Follow>().eq("user_id", userId).eq("follow_user_id", followUserId));
                if(isSuccess) {
                    stringRedisTemplate.opsForSet().remove(RedisConstants.FOLLOW_KEY+userId,followUserId.toString());

                }
            }
            return Result.ok();
        }

    /**
     * 关注了没
     * @param followUserId
     * @return
     */
    @Override
    public Result followornot(Long followUserId) {
        Long userId = UserHolder.getUser().getId();
        Integer count = query().eq("user_id", userId).eq("follow_user_id", followUserId).count();
        return  Result.ok(count > 0);
    }

    /**
     * 共同关注
     * @param id
     * @return
     */
    @Override
    public Result followCommons(Long id) {
        Long userId = UserHolder.getUser().getId();
        String key1=RedisConstants.FOLLOW_KEY+userId;
        String key2=RedisConstants.FOLLOW_KEY+id;
        //求交集
        Set<String> collect = stringRedisTemplate.opsForSet().intersect(key1, key2);
        if(collect==null || collect.isEmpty()) {
            return Result.ok(Collections.emptyList());
        }
        //解析出ID集合
        List<Long> ids = collect.stream().map(Long::valueOf).collect(Collectors.toList());
        List<UserDTO> collect1 = userService.listByIds(ids).stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());
        return  Result.ok(collect1);
    }
}
